using UnityEngine;

[DisallowMultipleComponent]
public class ShaderPropertySetter : MonoBehaviour { 
	//这里是设定了一个脚本，并且定义了BaseColor，能够在脚本中修改BaseColor来修改Shader中定义的BaseColor，这样我们就只需要一个Material和脚本调整参数，就可以简化整个设计
	//虽然我们可以通过脚本这样设计，会在Dynamic Batching没有开启的时候，导致Static Batching无法作用上去。会使整体相同Material的Object也无法Batching化

	static int BaseColorId = Shader.PropertyToID("_BaseColor");
	static int IntensityId = Shader.PropertyToID("_Intensity");

	[SerializeField]
	Color BaseColor = Color.white;
	[SerializeField]
	float Intensity = 0.0f;
	static MaterialPropertyBlock MPB;

	void OnValidate() { 
		//修改属性之后会调用的代码
		//如果没有OnValidate函数，那么修改了属性之后也不会执行我们Set的操作
		if (MPB == null) {
			MPB = new MaterialPropertyBlock();
		}
		MPB.SetColor(BaseColorId, BaseColor);	
		MPB.SetFloat(IntensityId, Intensity);	
		GetComponent<Renderer>().SetPropertyBlock(MPB);
	}

	void Awake() {
		//在Build的时候程序不会调用OnValidate所以需要一个Awake接口去让Material参数按照这个脚本修改
		OnValidate();
	}
}